home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / clm89nov.arc / LADD.CPP < prev    next >
Text File  |  1989-12-25  |  6KB  |  276 lines

  1. LISTING 1.
  2. //  Module:     Containr (Abstract Base Class for Containers)
  3. //  Version:    1.00    01-Sep-1989
  4. //
  5. //  Language:   C++ 2.0
  6. //  Environ:    Any
  7. //  Compilers:  Zortech C++
  8. //
  9. //  Purpose:    Provides an abstract base class for container classes.
  10. //
  11. //  Written by: Scott Robert Ladd
  12. //              705 West Virginia
  13. //              Gunnison CO 81230
  14. //
  15. //              MCI ID:  srl
  16. //              FidoNet: 1:104/45.2
  17.  
  18. class Container
  19.     {
  20.     public:
  21.         // store an item
  22.         virtual int Store(void * item, unsigned int size) = 0;
  23.  
  24.         // examine an item
  25.         virtual int Examine(void * item) = 0;
  26.  
  27.         // retrieve an item
  28.         virtual int Retrieve(void * item) = 0;
  29.  
  30.         // return number of items in a container
  31.         virtual unsigned long GetCount() = 0;
  32.  
  33.         // eliminate contents
  34.         virtual void Empty() = 0;
  35.     };
  36.  
  37. class KeyedContainer : public Container
  38.     {
  39.     public:
  40.         // store an item and its key
  41.         virtual int Store(void * key, void * item, unsigned int size) = 0;
  42.  
  43.         // examine an item
  44.         virtual int Examine(void * key, void * item) = 0;
  45.  
  46.         // retrieve an item by key
  47.         virtual int Remove(void * key, void * item, unsigned int size) = 0;
  48.     };
  49.  
  50.  
  51.  
  52. LISTING 2.
  53. //  Header:     SingList (Singly-Linked Lists)
  54. //  Version:    1.00     01-Sep-1989
  55. //
  56. //  Language:   C++ 2.0
  57. //  Environ:    Any
  58. //  Compilers:  Zortech C++
  59. //
  60. //  Purpose:    Provides a general set of singly-linked list classes
  61. //
  62. //  Written by: Scott Robert Ladd
  63. //              705 West Virginia
  64. //              Gunnison CO 81230
  65. //
  66. //              MCI ID:  srl
  67. //              FidoNet: 1:104/45.2
  68.  
  69. #include "containr.hpp"
  70.  
  71. class SinglyLinkedList : public Container
  72.     {
  73.     protected:
  74.         // structure of a node in a list
  75.         struct ListNode
  76.             {
  77.             ListNode  *  Next;
  78.             void      *  DataPtr;
  79.             unsigned int DataLen;
  80.             };
  81.  
  82.         ListNode * Head;  // pointer to first node
  83.         ListNode * Tail;  // pointer to the last node
  84.  
  85.         unsigned long Count; // number of nodes in list
  86.  
  87.     public:
  88.         // constructor
  89.         SinglyLinkedList();
  90.  
  91.         // destructor
  92.         ~SinglyLinkedList();
  93.  
  94.         // obtain list size method
  95.         virtual unsigned long GetCount()
  96.             {
  97.             return Count;
  98.             }
  99.  
  100.         // remove all items from a list
  101.         virtual void Empty();
  102.     };
  103.  
  104. class Stack : public SinglyLinkedList
  105.     {
  106.     public:
  107.         // store an item in a stack
  108.         virtual int Store(void * item, unsigned int size);
  109.  
  110.         // examine the top item in the stack
  111.         virtual int Examine(void * item);
  112.  
  113.         // retrieve the top item in a stack (and remove it)
  114.         virtual int Retrieve(void * item);
  115.     };
  116.  
  117. class Queue : public Stack
  118.     {
  119.     public:
  120.         // store an item in a queue
  121.         virtual int Store(void * item, unsigned int size);
  122.     };
  123.  
  124.  
  125.  
  126. LISTING 3.
  127. //  Module:     SingList (Singly-Linked Lists)
  128. //  Version:    1.00     01-Sep-1989
  129. //
  130. //  Language:   C++ 2.0
  131. //  Environ:    Any
  132. //  Compilers:  Zortech C++
  133. //
  134. //  Purpose:    Provides a general set of singly-linked list classes
  135. //
  136. //  Written by: Scott Robert Ladd
  137. //              705 West Virginia
  138. //              Gunnison CO 81230
  139. //
  140. //              MCI ID:  srl
  141. //              FidoNet: 1:104/45.2
  142.  
  143. #include "singlist.hpp"
  144. #include "stddef.h"
  145. #include "string.h"
  146.  
  147. //-----------------------//
  148. // SinglyLinkedList methods //
  149. //-----------------------//
  150.  
  151. // constructor
  152. SinglyLinkedList::SinglyLinkedList()
  153.     {
  154.     Head  = NULL;
  155.     Tail  = NULL;
  156.     Count = 0;
  157.     }
  158.  
  159. // destructor
  160. SinglyLinkedList::~SinglyLinkedList()
  161.     {
  162.     this->Empty();
  163.     }
  164.  
  165. void SinglyLinkedList::Empty()
  166.     {
  167.     ListNode * temp;
  168.  
  169.     temp = Head;
  170.  
  171.     while (temp != NULL)
  172.         {
  173.         delete temp;
  174.         temp = temp->Next;
  175.         }
  176.     }
  177.  
  178. //---------------//
  179. // Stack methods //
  180. //---------------//
  181.  
  182. // add new item
  183. int Stack::Store(void * item, unsigned size)
  184.     {
  185.     ListNode * new_node;
  186.  
  187.     new_node = new ListNode;
  188.  
  189.     if (NULL == new_node)
  190.         return 1;
  191.  
  192.     new_node->Next    = Head;
  193.     new_node->DataPtr = new char[size];
  194.     new_node->DataLen = size;
  195.  
  196.     memcpy(new_node->DataPtr,item,size);
  197.  
  198.     Head = new_node;
  199.  
  200.     if (Tail == NULL)
  201.         Tail = new_node;
  202.  
  203.     ++Count;
  204.  
  205.     return 0;
  206.     }
  207.  
  208. // examine the top item on the stack
  209. int Stack::Examine(void * item)
  210.     {
  211.     if (Count == 0)
  212.         return 1;
  213.  
  214.     memcpy(item,Head->DataPtr,Head->DataLen);
  215.  
  216.     return 0;
  217.     }
  218.  
  219. // read and remove the top item on the stack
  220. int Stack::Retrieve(void * item)
  221.     {
  222.     ListNode * temp;
  223.  
  224.     if (Count == 0)
  225.         return 1;
  226.  
  227.     temp = Head->Next;
  228.  
  229.     memcpy(item,Head->DataPtr,Head->DataLen);
  230.  
  231.     delete Head->DataPtr;
  232.     delete Head;
  233.  
  234.     Head = temp;
  235.  
  236.     --Count;
  237.  
  238.     return 0;
  239.     }
  240.  
  241. //---------------//
  242. // Queue methods //
  243. //---------------//
  244.  
  245. // add new item
  246. int Queue::Store(void * item, unsigned int size)
  247.     {
  248.     ListNode * new_node;
  249.  
  250.     new_node = new ListNode;
  251.  
  252.     if (NULL == new_node)
  253.         return 1;
  254.  
  255.     new_node->Next     = NULL;
  256.     new_node->DataPtr = new char[size];
  257.     new_node->DataLen = size;
  258.  
  259.     memcpy(new_node->DataPtr,item,size);
  260.  
  261.     if (Count > 0)
  262.         {
  263.         Tail->Next = new_node;
  264.         Tail       = new_node;
  265.         }
  266.     else
  267.         {
  268.         Head = new_node;
  269.         Tail = new_node;
  270.         }
  271.  
  272.     ++Count;
  273.  
  274.     return 0;
  275.     }
  276.